/*
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * Copyright 2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sun.org.apache.xerces.internal.util;

import java.io.InputStream;
import java.io.Reader;

import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

/**
 * <p>An <code>XMLInputSource</code> analogue to <code>javax.xml.transform.sax.SAXSource</code>.</p>
 */
public final class SAXInputSource extends XMLInputSource {

  private XMLReader fXMLReader;
  private InputSource fInputSource;

  public SAXInputSource() {
    this(null);
  }

  public SAXInputSource(InputSource inputSource) {
    this(null, inputSource);
  }

  public SAXInputSource(XMLReader reader, InputSource inputSource) {
    super(inputSource != null ? inputSource.getPublicId() : null,
        inputSource != null ? inputSource.getSystemId() : null, null);
    if (inputSource != null) {
      setByteStream(inputSource.getByteStream());
      setCharacterStream(inputSource.getCharacterStream());
      setEncoding(inputSource.getEncoding());
    }
    fInputSource = inputSource;
    fXMLReader = reader;
  }

  public void setXMLReader(XMLReader reader) {
    fXMLReader = reader;
  }

  public XMLReader getXMLReader() {
    return fXMLReader;
  }

  public void setInputSource(InputSource inputSource) {
    if (inputSource != null) {
      setPublicId(inputSource.getPublicId());
      setSystemId(inputSource.getSystemId());
      setByteStream(inputSource.getByteStream());
      setCharacterStream(inputSource.getCharacterStream());
      setEncoding(inputSource.getEncoding());
    } else {
      setPublicId(null);
      setSystemId(null);
      setByteStream(null);
      setCharacterStream(null);
      setEncoding(null);
    }
    fInputSource = inputSource;
  }

  public InputSource getInputSource() {
    return fInputSource;
  }

  /**
   * Sets the public identifier.
   *
   * @param publicId The new public identifier.
   */
  public void setPublicId(String publicId) {
    super.setPublicId(publicId);
    if (fInputSource == null) {
      fInputSource = new InputSource();
    }
    fInputSource.setPublicId(publicId);
  } // setPublicId(String)

  /**
   * Sets the system identifier.
   *
   * @param systemId The new system identifier.
   */
  public void setSystemId(String systemId) {
    super.setSystemId(systemId);
    if (fInputSource == null) {
      fInputSource = new InputSource();
    }
    fInputSource.setSystemId(systemId);
  } // setSystemId(String)

  /**
   * Sets the byte stream. If the byte stream is not already opened
   * when this object is instantiated, then the code that opens the
   * stream should also set the byte stream on this object. Also, if
   * the encoding is auto-detected, then the encoding should also be
   * set on this object.
   *
   * @param byteStream The new byte stream.
   */
  public void setByteStream(InputStream byteStream) {
    super.setByteStream(byteStream);
    if (fInputSource == null) {
      fInputSource = new InputSource();
    }
    fInputSource.setByteStream(byteStream);
  } // setByteStream(InputStream)

  /**
   * Sets the character stream. If the character stream is not already
   * opened when this object is instantiated, then the code that opens
   * the stream should also set the character stream on this object.
   * Also, the encoding of the byte stream used by the reader should
   * also be set on this object, if known.
   *
   * @param charStream The new character stream.
   * @see #setEncoding
   */
  public void setCharacterStream(Reader charStream) {
    super.setCharacterStream(charStream);
    if (fInputSource == null) {
      fInputSource = new InputSource();
    }
    fInputSource.setCharacterStream(charStream);
  } // setCharacterStream(Reader)

  /**
   * Sets the encoding of the stream.
   *
   * @param encoding The new encoding.
   */
  public void setEncoding(String encoding) {
    super.setEncoding(encoding);
    if (fInputSource == null) {
      fInputSource = new InputSource();
    }
    fInputSource.setEncoding(encoding);
  } // setEncoding(String)

} // SAXInputSource
